home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / Morpion 1.0.0 / source / PNL Libraries / MyAEUtils.unit next >
Encoding:
Text File  |  1993-12-03  |  17.1 KB  |  590 lines  |  [TEXT/PJMM]

  1. unit MyAEUtils;
  2.  
  3. interface
  4.  
  5.     uses
  6.         AppleEvents;
  7.  
  8.     const
  9.         typeMyPropertyToken = 'PTok';
  10.         myPropertiesResType = 'MPRP';
  11.  
  12.     type
  13.         SuspendedEvent = record
  14.                 waiting: boolean;
  15.                 event, reply: AppleEvent;
  16.                 dispatcher: EventHandlerProcPtr;
  17.                 refcon: longInt;
  18.             end;
  19.  
  20.     procedure InitAEUtils (GetPropertyFromContainer, SetPropertyFromContainer: ProcPtr);
  21. {  function GetPropertyFromContainer (prop: DescType; container: AEDesc; var result: AEDesc): OSErr;}
  22. {    function SetPropertyFromContainer (prop: DescType; container: AEDesc; value: AEDesc): OSErr;}
  23.  
  24.     function GotRequiredParams (theAppleEvent: AppleEvent): OSErr;
  25.  
  26.     function AEGetDescPtr (desc: AEDesc; desiredType: DescType; p: ptr; maximumSize: Size; var actualSize: Size): OSErr;
  27.  
  28.     procedure AECreate (var desc: AEDesc);
  29.     procedure AEDestroy (var desc: AEDesc); { dispose without error }
  30.     function AENull: AEDesc;
  31.  
  32.     function CreateStringDesc (s: str255; var desc: AEDesc): OSErr;
  33.     function CreateLongDesc (n: longInt; var desc: AEDesc): OSErr;
  34.     function CreateTypeDesc (t: DescType; var desc: AEDesc): OSErr;
  35.     function CreateBooleanDesc (b: boolean; var desc: AEDesc): OSErr;
  36.     function CreateFSSpecDesc (fs: FSSpec; var desc: AEDesc): OSErr;
  37.  
  38.     function CreateSelfTarget (var desc: AEDesc): OSErr;
  39.  
  40. { Guarentteed to preserve x on error }
  41.     function GetStringFromAEDesc (desc: AEDesc; var x: str255): OSErr;
  42.     function GetLongFromAEDesc (desc: AEDesc; var x: longInt): OSErr;
  43.     function GetTypeFromAEDesc (desc: AEDesc; var x: DescType): OSErr;
  44.     function GetBooleanFromAEDesc (desc: AEDesc; var x: boolean): OSErr;
  45.     function GetFSSpecFromAEDesc (desc: AEDesc; var x: FSSpec): OSErr;
  46.     function GetEnumeratedFromAEDesc (desc: AEDesc; var x: DescType): OSErr;
  47.  
  48. { Guarentteed to preserve x on error }
  49.     function GetStringFromAERecord (desc: AERecord; key: AEKeyword; var x: str255): OSErr;
  50.     function GetLongFromAERecord (desc: AERecord; key: AEKeyword; var x: longInt): OSErr;
  51.     function GetTypeFromAERecord (desc: AERecord; key: AEKeyword; var x: DescType): OSErr;
  52.     function GetBooleanFromAERecord (desc: AERecord; key: AEKeyword; var x: boolean): OSErr;
  53.     function GetFSSpecFromAERecord (event: AppleEvent; key: AEKeyword; var x: FSSpec): OSErr;
  54.     function GetEnumeratedFromAERecord (event: AppleEvent; key: AEKeyword; var x: DescType): OSErr;
  55.  
  56.     function PutStringToAERecord (desc: AERecord; key: AEKeyword; s: str255): OSErr;
  57.     function PutLongToAERecord (desc: AERecord; key: AEKeyword; n: longInt): OSErr;
  58.     function PutDateToAERecord (desc: AERecord; key: AEKeyword; date: longInt): OSErr;
  59.     function PutTypeToAERecord (desc: AERecord; key: AEKeyword; t: DescType): OSErr;
  60.     function PutBooleanToAERecord (desc: AERecord; key: AEKeyword; b: boolean): OSErr;
  61.     function PutFSSpecToAERecord (desc: AppleEvent; key: AEKeyword; fs: FSSpec): OSErr;
  62.  
  63.     function MyOAFindProperty (desiredClass: DescType; containerToken: AEDesc; containerClass: DescType; keyForm: DescType; keyData: AEDesc; var token: AEDesc; refcon: LongInt): OSErr;
  64.     function SetPropertyFromToken (token: AEDesc; value: AEDesc): OSErr;
  65.     function SetPropertyRecord (token: AEDesc; value: AEDesc): OSErr;
  66.     function GetPropertyFromToken (token: AEDesc; var result: AEDesc): OSErr;
  67.     function GetPropertyRecord (token: AEDesc; var result: AERecord): OSErr;
  68.  
  69.     function StorePropertyReferenceInToken (prop: DescType; container: AEDesc; var token: AEDesc): OSErr;
  70.     function RetrievePropertyReferenceFromToken (token: AEDesc; var prop: DescType; var container: AEDesc): OSErr;
  71.     function ValidProperty (class, prop: DescType): boolean;
  72.     function GetIndProperty (class: DescType; index: integer; var prop: DescType): boolean;
  73.  
  74.     function NullSuspendedEvent: SuspendedEvent;
  75.     function SuspendEvent (event, reply: AppleEvent; dispatcher: EventHandlerProcPtr; refcon: longInt; var se: SuspendedEvent): OSErr;
  76.     procedure ResumeEvent (var se: SuspendedEvent);
  77.  
  78. implementation
  79.  
  80.     uses
  81.         AEObjects, AERegistry, MyStrings;
  82.  
  83.     var
  84.         GetPropertyFromContainerProc: ProcPtr;
  85.         SetPropertyFromContainerProc: ProcPtr;
  86.  
  87.     function CallGetPropertyFromContainer (prop: DescType; container: AEDesc; var result: AEDesc; p: ptr): OSErr;
  88.     inline
  89.         $205F, $4E90;
  90.  
  91.     function CallSetPropertyFromContainer (prop: DescType; container: AEDesc; value: AEDesc; p: ptr): OSErr;
  92.     inline
  93.         $205F, $4E90;
  94.  
  95. {$S Init}
  96.     procedure InitAEUtils (GetPropertyFromContainer, SetPropertyFromContainer: ProcPtr);
  97.     begin
  98.         GetPropertyFromContainerProc := GetPropertyFromContainer;
  99.         SetPropertyFromContainerProc := SetPropertyFromContainer;
  100.     end;
  101. {$S}
  102.  
  103.     procedure AECreate (var desc: AEDesc);
  104.     begin
  105.         desc.descriptorType := typeNull;
  106.         desc.dataHandle := nil;
  107.     end;
  108.  
  109.     function AENull: AEDesc;
  110.         var
  111.             desc: AEDesc;
  112.     begin
  113.         AECreate(desc);
  114.         AENull := desc;
  115.     end;
  116.  
  117.     procedure AEDestroy (var desc: AEDesc);
  118.         var
  119.             junk: OSErr;
  120.     begin
  121.         junk := AEDisposeDesc(desc);
  122.         AECreate(desc);
  123.     end;
  124.  
  125.     function GotRequiredParams (theAppleEvent: AppleEvent): OSErr;
  126.         var
  127.             typeCode: DescType;
  128.             actualSize: Size;
  129.             err: OSErr;
  130.     begin
  131.         err := AEGetAttributePtr(theAppleEvent, keyMissedKeywordAttr, typeWildCard, typeCode, nil, 0, actualSize);    { nil ok: need only function result }
  132.         if err = errAEDescNotFound then        { we got all the required params: all is ok }
  133.             GotRequiredParams := noErr
  134.         else if err = noErr then
  135.             GotRequiredParams := errAEEventNotHandled
  136.         else
  137.             GotRequiredParams := err;
  138.     end; { GotRequiredParams }
  139.  
  140.     function AEGetDescPtr (desc: AEDesc; desiredType: DescType; p: ptr; maximumSize: Size; var actualSize: Size): OSErr;
  141.         var
  142.             err: OSErr;
  143.             result: AEDesc;
  144.             len: longInt;
  145.     begin
  146.         actualSize := 0;
  147.         err := AECoerceDesc(desc, desiredType, result);
  148.         if err = noErr then begin
  149.             actualSize := GetHandleSize(result.dataHandle);
  150.             len := actualSize;
  151.             if len > maximumSize then
  152.                 len := maximumSize;
  153.             BlockMove(result.dataHandle^, p, len);
  154.         end;
  155.         AEDestroy(result);
  156.         AEGetDescPtr := err;
  157.     end;
  158.  
  159.     function CreateSelfTarget (var desc: AEDesc): OSErr;
  160.         var
  161.             psn: ProcessSerialNumber;
  162.     begin
  163.         psn.lowLongOfPSN := kCurrentProcess;
  164.         psn.highLongOfPSN := 0;
  165.         CreateSelfTarget := AECreateDesc(typeProcessSerialNumber, @psn, SizeOf(psn), desc);
  166.     end;
  167.  
  168.     function CreateStringDesc (s: str255; var desc: AEDesc): OSErr;
  169.     begin
  170.         CreateStringDesc := AECreateDesc(typeChar, @s[1], length(s), desc);
  171.     end;
  172.  
  173.     function CreateLongDesc (n: longInt; var desc: AEDesc): OSErr;
  174.     begin
  175.         CreateLongDesc := AECreateDesc(typeLongInteger, @n, SizeOf(n), desc);
  176.     end;
  177.  
  178.     function CreateTypeDesc (t: DescType; var desc: AEDesc): OSErr;
  179.     begin
  180.         CreateTypeDesc := AECreateDesc(typeType, @t, SizeOf(t), desc);
  181.     end;
  182.  
  183.     function CreateBooleanDesc (b: boolean; var desc: AEDesc): OSErr;
  184.     begin
  185.         CreateBooleanDesc := AECreateDesc(typeBoolean, @b, SizeOf(b), desc);
  186.     end;
  187.  
  188.     function CreateFSSpecDesc (fs: FSSpec; var desc: AEDesc): OSErr;
  189.     begin
  190.         CreateFSSpecDesc := AECreateDesc(typeFSS, @fs, SizeOf(fs), desc);
  191.     end;
  192.  
  193.     function GetStringFromAEDesc (desc: AEDesc; var x: str255): OSErr;
  194.         var
  195.             result: AEDesc;
  196.             err, junk: OSErr;
  197.     begin
  198.         err := AECoerceDesc(desc, typeChar, result);
  199.         if err = noErr then begin
  200.             x := HandleToString(result.dataHandle);
  201.             AEDestroy(result);
  202.         end;
  203.         GetStringFromAEDesc := err;
  204.     end;
  205.  
  206.     function GetLongFromAEDesc (desc: AEDesc; var x: longInt): OSErr;
  207.         var
  208.             len: longInt;
  209.             err: OSErr;
  210.             temp: longInt;
  211.     begin
  212.         err := AEGetDescPtr(desc, typeLongInteger, @temp, SizeOf(temp), len);
  213.         if err = noErr then
  214.             x := temp;
  215.         GetLongFromAEDesc := err;
  216.     end;
  217.  
  218.     function GetTypeFromAEDesc (desc: AEDesc; var x: DescType): OSErr;
  219.         var
  220.             len: longInt;
  221.             err: OSErr;
  222.             temp: DescType;
  223.     begin
  224.         err := AEGetDescPtr(desc, typeType, @temp, SizeOf(temp), len);
  225.         if err = noErr then
  226.             x := temp;
  227.         GetTypeFromAEDesc := err;
  228.     end;
  229.  
  230.     function GetBooleanFromAEDesc (desc: AEDesc; var x: boolean): OSErr;
  231.         var
  232.             len: longInt;
  233.             err: OSErr;
  234.             temp: boolean;
  235.     begin
  236.         err := AEGetDescPtr(desc, typeBoolean, @temp, SizeOf(temp), len);
  237.         if err = noErr then
  238.             x := temp;
  239.         GetBooleanFromAEDesc := err;
  240.     end;
  241.  
  242.     function GetFSSpecFromAEDesc (desc: AEDesc; var x: FSSpec): OSErr;
  243.         var
  244.             err: OSErr;
  245.             len: longInt;
  246.             temp: FSSpec;
  247.     begin
  248.         err := AEGetDescPtr(desc, typeFSS, @temp, SizeOf(temp), len);
  249.         if err = noErr then
  250.             x := temp;
  251.         GetFSSpecFromAEDesc := err;
  252.     end;
  253.  
  254.     function GetEnumeratedFromAEDesc (desc: AEDesc; var x: DescType): OSErr;
  255.         var
  256.             err: OSErr;
  257.     begin
  258.         err := noErr;
  259.         if (GetHandleSize(desc.dataHandle) <> SizeOf(DescType)) then begin
  260.             err := errAETypeError;
  261.         end;
  262.         if err = noErr then begin
  263.             BlockMove(desc.dataHandle^, @x, SizeOf(x));
  264.         end;
  265.         GetEnumeratedFromAEDesc := err;
  266.     end;
  267.  
  268.     function GetStringFromAERecord (desc: AERecord; key: AEKeyword; var x: str255): OSErr;
  269.         var
  270.             dummy: DescType;
  271.             actual: Size;
  272.             err: OSErr;
  273.             temp: str255;
  274.     begin
  275.         err := AEGetKeyPtr(desc, key, typeChar, dummy, @temp[1], 255, actual);
  276.         if err = noErr then begin
  277.             temp[0] := chr(actual);
  278.             x := temp;
  279.         end;
  280.         GetStringFromAERecord := err;
  281.     end;
  282.  
  283.     function GetLongFromAERecord (desc: AERecord; key: AEKeyword; var x: longInt): OSErr;
  284.         var
  285.             dummy: DescType;
  286.             actual: Size;
  287.             err: OSErr;
  288.             temp: longInt;
  289.     begin
  290.         err := AEGetKeyPtr(desc, key, typeLongInteger, dummy, @temp, SizeOf(temp), actual);
  291.         if err = noErr then
  292.             x := temp;
  293.         GetLongFromAERecord := err;
  294.     end;
  295.  
  296.     function GetTypeFromAERecord (desc: AERecord; key: AEKeyword; var x: DescType): OSErr;
  297.         var
  298.             dummy: DescType;
  299.             actual: Size;
  300.             err: OSErr;
  301.             temp: DescType;
  302.     begin
  303.         err := AEGetKeyPtr(desc, key, typeType, dummy, @temp, SizeOf(temp), actual);
  304.         if err = noErr then
  305.             x := temp;
  306.         GetTypeFromAERecord := err;
  307.     end;
  308.  
  309.     function GetBooleanFromAERecord (desc: AERecord; key: AEKeyword; var x: boolean): OSErr;
  310.         var
  311.             dummy: DescType;
  312.             actual: Size;
  313.             err: OSErr;
  314.             temp: boolean;
  315.     begin
  316.         err := AEGetKeyPtr(desc, key, typeBoolean, dummy, @temp, SizeOf(temp), actual);
  317.         if err = noErr then
  318.             x := temp;
  319.         GetBooleanFromAERecord := err;
  320.     end;
  321.  
  322.     function GetFSSpecFromAERecord (event: AppleEvent; key: AEKeyword; var x: FSSpec): OSErr;
  323.         var
  324.             dummy: DescType;
  325.             actual: Size;
  326.             err: OSErr;
  327.             temp: FSSpec;
  328.     begin
  329.         err := AEGetKeyPtr(event, key, typeFSS, dummy, @temp, SizeOf(temp), actual);
  330.         if err = noErr then
  331.             x := temp;
  332.         GetFSSpecFromAERecord := err;
  333.     end;
  334.  
  335.     function GetEnumeratedFromAERecord (event: AppleEvent; key: AEKeyword; var x: DescType): OSErr;
  336.         var
  337.             err: OSErr;
  338.             value: AEDesc;
  339.     begin
  340.         err := AEGetParamDesc(event, key, typeWildCard, value);
  341.         if err = noErr then begin
  342.             err := GetEnumeratedFromAEDesc(value, x);
  343.         end;
  344.         AEDestroy(value);
  345.         GetEnumeratedFromAERecord := err;
  346.     end;
  347.  
  348.     function PutStringToAERecord (desc: AERecord; key: AEKeyword; s: str255): OSErr;
  349.     begin
  350.         PutStringToAERecord := AEPutKeyPtr(desc, key, typeChar, @s[1], length(s));
  351.     end;
  352.  
  353.     function PutLongToAERecord (desc: AERecord; key: AEKeyword; n: longInt): OSErr;
  354.     begin
  355.         PutLongToAERecord := AEPutKeyPtr(desc, key, typeLongInteger, @n, SizeOf(n));
  356.     end;
  357.  
  358.     function PutDateToAERecord (desc: AERecord; key: AEKeyword; date: longInt): OSErr;
  359.         var
  360.             longdate: record
  361.                     zero: longInt;
  362.                     date: longInt;
  363.                 end;
  364.     begin
  365.         longdate.zero := 0;
  366.         longdate.date := date;
  367.         PutDateToAERecord := AEPutKeyPtr(desc, key, typeLongDateTime, @longdate, SizeOf(longdate));
  368.     end;
  369.  
  370.     function PutTypeToAERecord (desc: AERecord; key: AEKeyword; t: DescType): OSErr;
  371.     begin
  372.         PutTypeToAERecord := AEPutKeyPtr(desc, key, typeType, @t, SizeOf(t));
  373.     end;
  374.  
  375.     function PutBooleanToAERecord (desc: AERecord; key: AEKeyword; b: boolean): OSErr;
  376.     begin
  377.         PutBooleanToAERecord := AEPutKeyPtr(desc, key, typeBoolean, @b, SizeOf(b));
  378.     end;
  379.  
  380.     function PutFSSpecToAERecord (desc: AppleEvent; key: AEKeyword; fs: FSSpec): OSErr;
  381.     begin
  382.         PutFSSpecToAERecord := AEPutKeyPtr(desc, key, typeFSS, @fs, SizeOf(fs));
  383.     end;
  384.  
  385.     function StorePropertyReferenceInToken (prop: DescType; container: AEDesc; var token: AEDesc): OSErr;
  386.         var
  387.             h: handle;
  388.             err: OSErr;
  389.     begin
  390.         h := nil;
  391.         err := PtrToHand(@prop, h, SizeOf(DescType));
  392.         if err = noErr then
  393.             err := PtrAndHand(@container.descriptorType, h, SizeOf(DescType));
  394.         if err = noErr then
  395.             err := HandAndHand(container.dataHandle, h);
  396.         if err = noErr then begin
  397.             HLock(h);
  398.             err := AECreateDesc(typeMyPropertyToken, h^, GetHandleSize(h), token);
  399.         end;
  400.         DisposeHandle(h);
  401.         StorePropertyReferenceInToken := err;
  402.     end;
  403.  
  404.     function RetrievePropertyReferenceFromToken (token: AEDesc; var prop: DescType; var container: AEDesc): OSErr;
  405.         var
  406.             conttype: DescType;
  407.             err: OSErr;
  408.     begin
  409.         BlockMove(token.dataHandle^, @prop, SizeOf(DescType));
  410.         BlockMove(ptr(ord(token.dataHandle^) + SizeOf(DescType)), @conttype, SizeOf(DescType));
  411.         HLock(token.dataHandle);
  412.         err := AECreateDesc(conttype, ptr(ord(token.dataHandle^) + 2 * SizeOf(DescType)), GetHandleSize(token.dataHandle) - 2 * SizeOf(DescType), container);
  413.         HUnlock(token.dataHandle);
  414.         if err <> noErr then begin
  415.             AECreate(container);
  416.         end;
  417.         RetrievePropertyReferenceFromToken := err;
  418.     end;
  419.  
  420.     type
  421.         propertiesRecord = record
  422.                 count: integer;
  423.                 props: array[1..1000] of DescType;
  424.             end;
  425.         propertiesRecordPtr = ^propertiesRecord;
  426.         propertiesRecordHandle = ^propertiesRecordPtr;
  427.  
  428.     function GetIndProperty (class: DescType; index: integer; var prop: DescType): boolean;
  429.         var
  430.             h: propertiesRecordHandle;
  431.     begin
  432.         h := propertiesRecordHandle(GetNamedResource(myPropertiesResType, class));
  433.         GetIndProperty := false;
  434.         if h <> nil then begin
  435.             if (0 < index) & (index <= h^^.count) then begin
  436.                 prop := h^^.props[index];
  437.                 GetIndProperty := true;
  438.             end;
  439.             HPurge(handle(h));
  440.         end;
  441.     end;
  442.  
  443.     function ValidProperty (class, prop: DescType): boolean;
  444.         var
  445.             h: propertiesRecordHandle;
  446.             i: integer;
  447.     begin
  448.         h := propertiesRecordHandle(GetNamedResource(myPropertiesResType, class));
  449.         ValidProperty := false;
  450.         if h <> nil then begin
  451.             for i := 1 to h^^.count do begin
  452.                 if h^^.props[i] = prop then begin
  453.                     ValidProperty := true;
  454.                     leave;
  455.                 end;
  456.             end;
  457.             HPurge(handle(h));
  458.         end;
  459.     end;
  460.  
  461.     function MyOAFindProperty (desiredClass: DescType; containerToken: AEDesc; containerClass: DescType; keyForm: DescType; keyData: AEDesc; var token: AEDesc; refcon: LongInt): OSErr;
  462.         var
  463.             err: OSErr;
  464.             prop: DescType;
  465.     begin
  466.         if keyForm = formPropertyID then begin
  467.             err := GetTypeFromAEDesc(keyData, prop);
  468.             if err = noErr then begin
  469.                 if ValidProperty(containerToken.descriptorType, prop) then begin
  470.                     err := StorePropertyReferenceInToken(prop, containerToken, token);
  471.                 end
  472.                 else begin
  473.                     err := errAENoSuchObject;
  474.                 end;
  475.             end;
  476.         end
  477.         else begin
  478.             err := errAEBadKeyForm;
  479.         end;
  480.         MyOAFindProperty := err;
  481.     end;
  482.  
  483.     function SetPropertyFromToken (token: AEDesc; value: AEDesc): OSErr;
  484.         var
  485.             err, junk: OSErr;
  486.             prop: DescType;
  487.             container: AEDesc;
  488.     begin
  489.         err := RetrievePropertyReferenceFromToken(token, prop, container);
  490.         if err = noErr then begin
  491.             err := CallSetPropertyFromContainer(prop, container, value, SetPropertyFromContainerProc);
  492.         end;
  493.         AEDestroy(container);
  494.         SetPropertyFromToken := err;
  495.     end;
  496.  
  497.     function SetPropertyRecord (token: AEDesc; value: AEDesc): OSErr;
  498.         var
  499.             index: integer;
  500.             prop: DescType;
  501.             element: AEDesc;
  502.             err, junk: OSErr;
  503.     begin
  504.         index := 1;
  505.         while (err = noErr) & GetIndProperty(token.descriptorType, index, prop) do begin
  506.             err := AEGetKeyDesc(value, prop, typeWildCard, element);
  507.             if err = noErr then begin
  508.                 err := CallSetPropertyFromContainer(prop, token, element, SetPropertyFromContainerProc);
  509.                 AEDestroy(element);
  510.             end
  511.             else if err = errAEDescNotFound then begin
  512.                 err := noErr;
  513.             end;
  514.             index := index + 1;
  515.         end;
  516.         SetPropertyRecord := err;
  517.     end;
  518.  
  519.     function GetPropertyFromToken (token: AEDesc; var result: AEDesc): OSErr;
  520.         var
  521.             err, junk: OSErr;
  522.             prop: DescType;
  523.             container: AEDesc;
  524.     begin
  525.         err := RetrievePropertyReferenceFromToken(token, prop, container);
  526.         if err = noErr then begin
  527.             err := CallGetPropertyFromContainer(prop, container, result, GetPropertyFromContainerProc);
  528.         end;
  529.         AEDestroy(container);
  530.         GetPropertyFromToken := err;
  531.     end;
  532.  
  533.     function GetPropertyRecord (token: AEDesc; var result: AERecord): OSErr;
  534.         var
  535.             index: integer;
  536.             prop: DescType;
  537.             element: AEDesc;
  538.             err, junk: OSErr;
  539.     begin
  540.         err := AECreateList(nil, 0, true, result);
  541.         index := 1;
  542.         while (err = noErr) & GetIndProperty(token.descriptorType, index, prop) do begin
  543.             err := CallGetPropertyFromContainer(prop, token, element, GetPropertyFromContainerProc);
  544.             if err = noErr then begin
  545.                 err := AEPutKeyDesc(result, prop, element);
  546.                 AEDestroy(element);
  547.             end
  548.             else if err = errAEReadDenied then begin
  549.                 err := noErr;
  550.             end;
  551.             index := index + 1;
  552.         end;
  553.         if err <> noErr then begin
  554.             AEDestroy(result);
  555.         end;
  556.         GetPropertyRecord := err;
  557.     end;
  558.  
  559.     function NullSuspendedEvent: SuspendedEvent;
  560.         var
  561.             se: SuspendedEvent;
  562.     begin
  563.         se.waiting := false;
  564.         NullSuspendedEvent := se;
  565.     end;
  566.  
  567.     function SuspendEvent (event, reply: AppleEvent; dispatcher: EventHandlerProcPtr; refcon: longInt; var se: SuspendedEvent): OSErr;
  568.         var
  569.             err: OSErr;
  570.     begin
  571.         se.event := event;
  572.         se.reply := reply;
  573.         se.dispatcher := dispatcher;
  574.         se.refcon := refcon;
  575.         err := AESuspendTheCurrentEvent(event);
  576.         se.waiting := err = noErr;
  577.         SuspendEvent := err;
  578.     end;
  579.  
  580.     procedure ResumeEvent (var se: SuspendedEvent);
  581.         var
  582.             junk: OSErr;
  583.     begin
  584.         if se.waiting then begin
  585.             se.waiting := false;
  586.             junk := AEResumeTheCurrentEvent(se.event, se.reply, se.dispatcher, se.refcon);
  587.         end;
  588.     end;
  589.  
  590. end.